package com.china_goldcard.igas.utils;

import java.security.MessageDigest;
import java.util.Arrays;

/**
 * Created by jk on 16/10/10.
 */

public class TokenUtils {

    private TokenUtils(){

    }

    /* 加密
    * @param name
    * @param pwd
    * @param timeStap
    * @return
            * @throws Exception
    */
    public static String token(String name, String pwd, String timeStap){
        if (name == null || name.equals("") || pwd == null || pwd.equals("")) {
            return null;
        }
        String[] sortedParam = sortByHashCode(name, pwd);
        StringBuilder unEncyKey = new StringBuilder();
        for (String p : sortedParam) {
            unEncyKey.append(p);
        }
        // 对排序后的参数做MD5加密，生成KEY
        String KEY = getMD5Value(unEncyKey.toString(), "UTF-8");
        // 对参数进行字典排序
        Arrays.sort(sortedParam);

        // 将KEY插入参数的第二位
        StringBuilder unEncySign = new StringBuilder();

        unEncySign.append(sortedParam[0]).append(KEY).append(sortedParam[1]).append(timeStap);

        // 最后对组装的字符串进行MD5加密
        String token = getMD5Value(unEncySign.toString(), "UTF-8");

        return token;
    }

    /**
     * 根据hashcode排序
     * @param name
     * @param pwd
     * @return
     */
    private static String[] sortByHashCode(String name, String pwd) {
        int nameHash = name.hashCode();
        int pwdHash = pwd.hashCode();
        if (nameHash > pwdHash) {
            return new String[] { name, pwd };
        } else if (nameHash < pwdHash) {
            return new String[] { pwd, name };
        } else {
            return new String[] { name, pwd };
        }
    }

    /**
     * MD5加密
     * @author Leiyt
     * @date   2014年1月10日 上午11:05:39
     * @param param 加密内容
     * @param charset   编码格式(UTF-8 ISO8859-1 ....)
     * @return
     * @throws Exception
     */
    private static String getMD5Value(String param, String charset) {
        try{
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] bytes = md5.digest(param.getBytes(charset));
            return toHexString(bytes);
        }catch (Exception ex){
            return "";
        }
    }

    /**
     * 二进制转换十六进制
     * @author Leiyt
     * @date   2014年1月10日 上午11:05:21
     * @param bytes
     * @return
     */
    private static String toHexString(byte[] bytes) {
        StringBuffer md5 = new StringBuffer(50);
        for (int i = 0; i < bytes.length; i++) {
            if (Integer.toHexString(0xFF & bytes[i]).length() == 1){
                md5.append("0").append(Integer.toHexString(0xFF & bytes[i]));
            } else{
                md5.append(Integer.toHexString(0xFF & bytes[i]));
            }
        }
        return md5.toString();
    }

}
